import csv  # 导入模块csv来处理以CSV(逗号分隔的值)格式存储的天气数据
from matplotlib import pyplot as plt
from datetime import datetime

class TemperatureAnalyzation():
    """重构highs_lows.py"""
    def __init__(self, csv_filename, ini_fontsize, ini_title = ''):
        """初始化文件名"""
        self.filename = csv_filename
        self.dates, self.highs, self.lows = [], [], []  # 三个空列表用于提取日期、最高气温和最低气温
        self.f = open(self.filename)# 打开文件，并将结果文件对象存储在f中
        self.reader = csv.reader(self.f)  # 创建一个与该文件相关联的阅读器（reader）对象
        # readers处理文件中以逗号分隔的第一行数据，
        # 并将每项数据都作为一个元素存储在列表中
        self.header_row = next(self.reader)  # 返回文件中的下一行（这里得到的是第一行，其中包含文件头）
        self.title = ini_title
        self.title_fontsize = ini_fontsize


    def get_data(self):
        """获取日期、最高气温和最低气温数据"""
        for row in self.reader:  # 遍历文件中余下的各行
            try:
                current_date = datetime.strptime(row[0], "%Y-%m-%d")
                # datetime.strptime()方法的工作原理
                # 第一个实参为包含所需日期的字符串，第二个实参告诉Python如何设置日期的格式
                high = int(row[1])
                # 第二项是最高温度，将字符串转换为数字，以便matplotlib能够读取它们
                low = int(row[3])
            except ValueError:
                print(current_date, 'missing data')
            else:
                self.dates.append(current_date)
                self.highs.append(high)
                self.lows.append(low)

    def title_setting(self):
        """设置图标标题及其字号"""
        plt.title(self.title, fontsize=self.title_fontsize)
        plt.xlabel('', fontsize=16)
        plt.ylabel('Temperature(F)', fontsize=16)
        plt.tick_params(axis='both', which='major', labelsize=16)

    def data_visualized(self):
        """根据数据绘制图形"""
        # 实参alpha指定颜色的透明度：0为完全透明，1(默认设置)为完全不透明
        # 函数figure()用于指定图标的宽度/高度/分辨率和背景色
        # figsize：窗口的尺寸（单位:英寸） dpi:分辨率
        fig = plt.figure(dpi=128, figsize=(10, 6))
        plt.plot(self.dates, self.highs, c='red', alpha=0.5)  # alpha=0.5可让折线颜色看起来更浅
        plt.plot(self.dates, self.lows, c='blue', alpha=0.5)
        # 方法plt.fill_between()需要一个x值系列dates，两个y值系列highs和lows
        # 实参facecolor指定了填充区域的颜色
        # alpha=0.1让填充区域将两个数据系列连接起来的同时不分散观察者的注意力
        plt.fill_between(self.dates, self.highs, self.lows, facecolor='blue', alpha=0.1)
        # plt.title("Daily high temperatures, July 2014", fontsize=24)
        self.title_setting()
        fig.autofmt_xdate()  # 调用fig.autofmt_xdate()绘制斜的日期标签以免彼此重叠
        plt.show()

    def run(self):
        """启动程序"""
        self.get_data()
        self.data_visualized()
        self.f.close()